package cn.iocoder.yudao.module.vos.service.secretaccount;

import java.math.BigDecimal;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.vos.controller.admin.secretaccount.vo.*;
import cn.iocoder.yudao.module.vos.dal.dataobject.secretaccount.SecretAccountDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.module.vos.service.secretaccount.vo.ChargeResult;

/**
 * 密钥管理 Service 接口
 *
 * @author shijun
 */
public interface SecretAccountService {

    /**
     * 创建密钥管理
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSecretAccount(@Valid SecretAccountSaveReqVO createReqVO);

    /**
     * 更新密钥管理
     *
     * @param updateReqVO 更新信息
     */
    void updateSecretAccount(@Valid SecretAccountSaveReqVO updateReqVO);

    /**
     * 删除密钥管理
     *
     * @param id 编号
     */
    void deleteSecretAccount(Long id);

    /**
    * 批量删除密钥管理
    *
    * @param ids 编号
    */
    void deleteSecretAccountListByIds(List<Long> ids);

    /**
     * 获得密钥管理
     *
     * @param id 编号
     * @return 密钥管理
     */
    SecretAccountDO getSecretAccount(Long id);

    /**
     * 获得密钥管理分页
     *
     * @param pageReqVO 分页查询
     * @return 密钥管理分页
     */
    PageResult<SecretAccountDO> getSecretAccountPage(SecretAccountPageReqVO pageReqVO);

    void recharge(SecretAccountRechargeReqVO reqVO);


    /**
     * 统一校验并返回账号对象：
     * - header 非空
     * - 账号存在/启用/未过期
     * - 拥有 requiredPermission（可空则跳过）
     * - 余额 > 0
     */
    SecretAccountDO checkAndGetAccount(String appSecret, String requiredPermission);

    /**
     * 扣费（仅当 shouldCharge=true 且单价>0）并写入请求日志；返回本次实际扣费金额和扣后余额。
     *
     * @param account           已通过校验的账号
     * @param unitPrice         单价（<=0 则不扣）
     * @param shouldCharge      是否需要扣费（例如查到结果才扣费）
     * @param url               请求路径（如 "/data/v1/search"）
     * @param paramsMasked      已脱敏的参数
     * @param productPermission 权限码（如 "risk_control_search_1"）
     * @param respBrief         响应摘要（如 "{size:10, charged:Y}"）
     * @param requestNo         请求号
     */
    ChargeResult chargeAndLog(SecretAccountDO account,
                              BigDecimal unitPrice,
                              boolean shouldCharge,
                              String url,
                              String paramsMasked,
                              String productPermission,
                              String respBrief,
                              String requestNo,
                              String ip);

    SecretAccountDO getByAppSecret(String appSecret);
}